跳到主要内容

Go 设置偏移量之 Seeker 接口

在学习词法分析时,发现有一个 Seeker 接口

type Seeker interface {
Seek(offset int64, whence int) (ret int64, err error)
}

这个 io.Seeker 接口定义了 Seek 方法,该方法用于指定下次读取或者写入时的偏移量,这样可以从某个特定位置开始操作数据流。听起来和 ReaderAt/WriteAt 接口有些类似,不过 Seeker 接口更灵活,可以更好的控制读写数据流的位置。

这个 Seek 方法用于设置下一次 Read 或 Write 的偏移量为 offset,它的解释取决于 whence: 0 表示相对于文件的起始处,1 表示相对于当前的偏移,而 2 表示相对于其结尾处。 不过一般使用它定义的枚举

const (
SeekStart = 0 // seek relative to the origin of the file
SeekCurrent = 1 // seek relative to the current offset
SeekEnd = 2 // seek relative to the end
)

Seek 返回新的偏移量和一个错误,如果有的话。

示例获取倒数第 3 个字符

提示

需要考虑 UTF-8 编码,例如中文的两个字符需要偏移 6 位,这里的代码只是一个示例

import (
"fmt"
"io"
"strings"
)

func main() {
reader := strings.NewReader("Hello Seeker")
reader.Seek(-3, io.SeekEnd)
r, _, _ := reader.ReadRune()
fmt.Printf("%c\n", r)
}

输出:

K